#include <stdio.h>
#include <stdlib.h>

//递归实现
int func(unsigned int n)
{
	if (n == 1)
		return 0;
	if (n % 2 == 0)
		return 1 + func(n/2);
	int x = func(n-1);
	int y = func(n+1);

//	printf("x:%d  y:%d\n", x, y);
	if (x < y) return 1 + x;
	else return 1 + y;
}

//迭代实现
int iter_func(unsigned int n)
{
	int count = 0;
	while(1) {
		if (n == 1)	break;

		if (n % 2 == 0) {
			n = n >> 1;

		} else if ((n & 0x07) == 0x07) {
			n += 1;	

		} else if ((n & 0x03) == 0x03 && (n & 0x08) == 0x08) {
			n += 1;

		} else {
			n -= 1;	
		}	
		
		count++;
	}

	return count;
}

void print(int n)
{
	printf("%d\t", n);

	int ret = func(n);
	printf("%d\t", ret);

	ret = iter_func(n);
	printf("%d\n", ret);
}

#define SIZE 100
int main()
{
	int a[SIZE] = {0};
	for(int i=0; i<SIZE; ++i) {
		a[i] = rand() % 1000;
		print(a[i]);
	}

//	int n = 383;
//	print(n);
}
